A debugger is a tool which enables a programmer to monitor the execution of a program. A debugger can stop execution of a program being debugged, re-start it, set breakpoints in the program, and/or access or change values in memory. A debugger can enable a program to be run step by step (called stepping), to stop at a particular line of code when a breakpoint is encountered (breaking) and can enable the value of variables to be inspected when the program is at a breakpoint or while the program is running (inspection). Some debuggers can also modify program state while the program is running, in addition to observing and reporting on program state. Hence, debuggers are typically very powerful. Moreover, the same functionality that makes a debugger useful for finding bugs also makes it useful as a software cracking tool to retrieve sensitive information, evade copy protection, circumvent digital rights management, and so on. Hence a debugger process is typically a highly privileged process.
When software running in a process is being debugged, other threads running in the process can be affected. For example, if a debugger is running on a server, clients accessing the server may experience a slow down in server response time or the application being debugged (and all the clients accessing the application being debugged) may even freeze.